//package com.demo.api.cache;
//
//import com.alibaba.fastjson.JSON;
//import com.demo.api.model.user.SysInterface;
//import com.demo.core.annotation.AuthToken;
//import com.demo.core.enums.RedisCacheEnum;
//import com.demo.core.redis.RedisCache;
//import com.demo.core.utils.StringUtils;
//import io.swagger.annotations.ApiModel;
//import io.swagger.annotations.ApiModelProperty;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.aop.support.AopUtils;
//import org.springframework.beans.BeansException;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.context.ApplicationContext;
//import org.springframework.context.ApplicationContextAware;
//import org.springframework.stereotype.Component;
//import org.springframework.web.bind.annotation.*;
//
//import javax.annotation.Resource;
//import java.lang.annotation.Annotation;
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.function.Function;
//
///**
// * @author Tan-Bowen
// * @version 1.0
// * @description TODO
// * @date 2021/8/6 18:21
// */
//@Slf4j
//@Component
//public class TestApplication implements CommandLineRunner, ApplicationContextAware {
//
//    @Resource
//    private ApplicationContext applicationContext;
//
//    @Override
//    public void run(String... args) throws Exception {
//
//    }
//
//
//    @Override
//    public void setApplicationContext(ApplicationContext arg0) {
//        Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(RestController.class);
//        List<String> urls = new ArrayList<>();
//        List<SysInterface> res = new ArrayList<>();
//        for (Map.Entry<String, Object> entry : controllers.entrySet()) {
//            Object value = entry.getValue();
//            Class<?> aClass = AopUtils.getTargetClass(value);
//            String url = "";
//            if (aClass.isAnnotationPresent(RequestMapping.class)) {
//                RequestMapping annotation = aClass.getAnnotation(RequestMapping.class);
//                String[] path = annotation.value();
//                url = annotationValue(path);
//            }
//            SysInterface cls = SysInterface.builder()
//                    .name(aClass.getName())
//                    .classPath(url)
//                    .methodPath("")
//                    .remarks(getApiMode(aClass))
//                    .auth(false)
//                    .methodType("")
//                    .build();
//            res.add(cls);
//            Method[] declaredMethods = aClass.getDeclaredMethods();
//            for (Method method : declaredMethods) {
//                String v = this.getUrl(method);
//                if (v != null) {
//                    String[] val = v.split(",");
//                    SysInterface sysInterface = SysInterface.builder()
//                            .name(method.getName())
//                            .classPath(url)
//                            .methodPath(StringUtils.append(url, val[0]))
//                            .remarks(getApiPro(method))
//                            .auth(method.getAnnotation(AuthToken.class).checkPower())
//                            .methodType(val[1])
//                            .build();
//                    res.add(sysInterface);
//                }
//            }
//        }
//    }
//
//    public String getUrl(Method method) {
//        if (!checkAnn(method, AuthToken.class)) return null;
//        if (checkAnn(method, RequestMapping.class)) {
//            RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
//            return annotationValue(requestMapping.value()) + "," + requestMapping.method()[0].name();
//        }
//        if (checkAnn(method, PostMapping.class)) {
//            return annotationValue(method.getAnnotation(PostMapping.class).value()) + "post";
//        }
//        if (checkAnn(method, GetMapping.class)) {
//            return annotationValue(method.getAnnotation(GetMapping.class).value()) + "get";
//        }
//        if (checkAnn(method, DeleteMapping.class)) {
//            return annotationValue(method.getAnnotation(DeleteMapping.class).value()) + "delete";
//        }
//        if (checkAnn(method, PutMapping.class)) {
//            return annotationValue(method.getAnnotation(PutMapping.class).value()) + "put";
//        }
//        return null;
//    }
//
//    public static boolean checkAnn(Method method, Class<? extends Annotation> cls) {
//        return method.isAnnotationPresent(cls);
//    }
//
//    public static boolean checkAnn(Class<?> cla, Class<? extends Annotation> cls) {
//        return cla.isAnnotationPresent(cls);
//    }
//
//    public static String getApiMode(Class<?> cls) {
//        if (checkAnn(cls, ApiModel.class)) {
//            return cls.getAnnotation(ApiModel.class).value();
//        }
//        return "";
//    }
//
//    public static String getApiPro(Method method) {
//        if (checkAnn(method, ApiModelProperty.class)) {
//            return method.getAnnotation(ApiModelProperty.class).value();
//        }
//        return "";
//    }
//
//    public String annotationValue(Object[] args) {
//        String res = "";
//        for (Object arg : args) {
//            res = StringUtils.append(res, arg.toString());
//        }
//        return res;
//    }
//}
